From de90d8d974918c200d1dcf8fa28c9c5296931540 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 7 Mar 2018 16:17:10 +0300 Subject: [PATCH] Move login to clap --- src/bin/cargo.rs | 4 ++-- src/bin/cli/login.rs | 10 +++++++++ src/bin/cli/mod.rs | 53 ++++++++++++++++++++++++++++++++++++++------ 3 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 src/bin/cli/login.rs diff --git a/src/bin/cargo.rs b/src/bin/cargo.rs index 7b34fecee..6e0b36700 100644 --- a/src/bin/cargo.rs +++ b/src/bin/cargo.rs @@ -90,7 +90,7 @@ fn main() { let is_clapified = ::std::env::args().any(|arg| match arg.as_ref() { "build" | "bench" | "check" | "clean" | "doc" | "fetch" | "generate-lockfile" | "git-checkout" | - "init" | "install" | "locate-project" => true, + "init" | "install" | "locate-project" | "login" => true, _ => false }); @@ -130,7 +130,7 @@ macro_rules! each_subcommand{ // $mac!(init); // $mac!(install); // $mac!(locate_project); - $mac!(login); +// $mac!(login); $mac!(metadata); $mac!(new); $mac!(owner); diff --git a/src/bin/cli/login.rs b/src/bin/cli/login.rs new file mode 100644 index 000000000..957bfe1c1 --- /dev/null +++ b/src/bin/cli/login.rs @@ -0,0 +1,10 @@ +use super::utils::*; + +pub fn cli() -> App { + subcommand("login") + .about("Save an api token from the registry locally. \ + If token is not specified, it will be read from stdin.") + .arg(Arg::with_name("token")) + .arg(opt("host", "Host to set the token for").value_name("HOST")) + .arg(opt("registry", "Registry to use").value_name("REGISTRY")) +} diff --git a/src/bin/cli/mod.rs b/src/bin/cli/mod.rs index 755f53077..cded0f399 100644 --- a/src/bin/cli/mod.rs +++ b/src/bin/cli/mod.rs @@ -3,17 +3,19 @@ extern crate clap; extern crate cargo; use std::slice; - -use cargo; +use std::io::{self, BufRead}; +use std::path::PathBuf; use clap::{AppSettings, Arg, ArgMatches}; -use cargo::{Config, CargoResult, CliError}; + +use cargo::{self, Config, CargoResult, CargoError, CliError}; use cargo::core::{Workspace, Source, SourceId, GitReference}; -use cargo::util::ToUrl; +use cargo::util::{ToUrl, CargoResultExt}; use cargo::util::important_paths::find_root_manifest_for_wd; use cargo::ops::{self, MessageFormat, Packages, CompileOptions, CompileMode, VersionControl}; -use cargo::sources::GitSource; +use cargo::sources::{GitSource, RegistrySource}; +use self::utils::*; pub fn do_main(config: &mut Config) -> Result<(), CliError> { let args = cli().get_matches(); @@ -282,12 +284,47 @@ pub fn do_main(config: &mut Config) -> Result<(), CliError> { cargo::print_json(&location); return Ok(()); } + ("login", Some(args)) => { + let registry = args.value_of("registry").map(|s| s.to_string()); + if registry.is_some() && !config.cli_unstable().unstable_options { + return Err(format_err!("registry option is an unstable feature and \ + requires -Zunstable-options to use.").into()); + } + + let token = match args.value_of("token") { + Some(token) => token.to_string(), + None => { + let host = match registry { + Some(ref _registry) => { + return Err(format_err!("token must be provided when \ + --registry is provided.").into()) + } + None => { + let src = SourceId::crates_io(config)?; + let mut src = RegistrySource::remote(&src, config); + src.update()?; + let config = src.config()?.unwrap(); + args.value_of("host").map(|s| s.to_string()) + .unwrap_or(config.api.unwrap()) + } + }; + println!("please visit {}me and paste the API Token below", host); + let mut line = String::new(); + let input = io::stdin(); + input.lock().read_line(&mut line).chain_err(|| { + "failed to read stdin" + }).map_err(CargoError::from)?; + line.trim().to_string() + } + }; + + ops::registry_login(config, token, registry)?; + return Ok(()); + } _ => return Ok(()) } } -use self::utils::*; -use std::path::PathBuf; fn cli() -> App { let app = App::new("cargo") @@ -364,6 +401,7 @@ See 'cargo help ' for more information on a specific command. init::cli(), install::cli(), locate_project::cli(), + login::cli(), ]) ; app @@ -383,6 +421,7 @@ mod git_checkout; mod init; mod install; mod locate_project; +mod login; mod utils { use clap::{self, SubCommand, AppSettings}; -- 2.30.2